package com.sky.JULlog;


import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;

/**
 * 日志输出的核心方法:  String.format(xxx);
 * 熟悉C语言应该记得C语言的printf()方法，两者有类似之处。format()方法有两种重载形式。
 */
public class FormatDemo {


    private static void formatInfo() {

        /*
         *  占位符格式==>
         *    % : 开始
         *    argument_number : 格式化的参数索引, 参数不能被分化, so省略
         *    flags :  数字正负号, 或者,
         *    width: 宽度 7个 , 多了 补空格
         *    .precision: 精度 , .1 表示只留一个小数
         *    type:  类型表示,  f 浮点数
         *        */
        System.out.println(String.format("%,7.1f", 42.000));


        /*
         * 转换符:
         *  -: 左对齐
         *  +: 正数添加+号
         * 0 : 数字前面补0
         * $:被格式化的参数索引
         * (: 使用(包含负数
         *
         *
         *
         *
         * */
        String raw = "hello word";
        String str = String.format("|%-15s|", raw);
        System.out.println(str);


        str=String.format("格式参数$的使用：%2$d,%1$s","abc", 99);
        System.out.println("$的使用 ==>" + str);

        int Integer = -1000;
        str = String.format("%(,d", Integer);  //将-1000显示为(1,000)
        System.out.println(str);


        double dou = 123.456789;
        System.out.print(String.format("浮点类型：%.2f %n", dou));
        System.out.print(String.format("十六进制浮点类型：%a %n", dou));
        System.out.print(String.format("通用浮点类型：%g %n", dou));

        int one = 123456789;
        double two = 123456.789;
        String s = String.format("第一个参数：%,d 第二个参数：%,.2f", one, two);
        System.out.println(s);

    }

    private static void formatSimpleUse() {


        String name = "Mike";
        double score = 89;
        Calendar calendar = Calendar.getInstance();
        calendar.set(1992, Calendar.JANUARY, 3);

        final String formatA = String.format("(%1$-5s) %2$tF score: (%3$-8.2f)", name, calendar, score);
        final String formatB = String.format("[%1$-5s] %2$tY-%2$tm-%2$td score: (%3$8.2f)", name, calendar, score);

        System.out.println(formatA);
        System.out.println(formatB);
    }


    private static void simplyLog() {
        Date dat = new Date();
        String source = "com.sky.JULlog.FormatDemo";
        String loggerName = source+ ".loggerName";

        String message = "simplyLog() ";
        Throwable throwable = new Throwable();


        String methodAndLine = Thread.currentThread().getStackTrace()[1].getMethodName()+"()" + Thread.currentThread().getStackTrace()[1].getLineNumber() +"   ";



        /*
         * %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS 第一个参数的格式:  yyyy-MM-dd hh:MM:ss
         * [%4$s]           第4个参数的格式 [ String类型字符串]
         * source:%2$s      第二个参数的格式: source [String类型字符串]
         * loggerName:%3$s  第三个参数的格式: loggerName:%3$s
         * %5$s             第五个参数的格式: String类型字符串
         * %6$s             第六个参数的格式: String类型字符串
         * %n               CRLF
         * */
        String format = "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS [%4$s] source:%2$s loggerName:%3$s  %5$s %6$s%n";
        String formattedStr = String.format(format, dat, source, loggerName, Level.INFO, methodAndLine +message, throwable);
        System.out.println("------------------------");
        System.out.println(formattedStr);

    }


    /*        %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n */
    public static void main(String[] args) {
        formatInfo();
        formatSimpleUse();
        simplyLog();
    }


}
